﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using QuanLyHocPhi.Model;
using System.Data;
using System.Data.Entity.Infrastructure;
using System.Data.Entity;
namespace QuanLyHocPhi.BLL
{
    /// <summary>
    /// Lớp xử lý nghiệp vụ về lớp chuyên ngành
    /// </summary>
    class BizLopChuyenNganh
    {
        /// <summary>
        /// Lấy lớp chuyên ngành theo mã
        /// </summary>
        /// <param name="maLopCN"></param>
        /// <returns></returns>
        internal static LopChuyenNganh GetLopChuyenNganhByMaLCN(string maLopCN)
        {
            using (var context = new QLHPEntities())
            {
                var lopChuyenNganh = context.LopChuyenNganhDbSet.Include(e=>e.Nganh).Where(e => e.MaLopChuyenNganh.Equals(maLopCN)).SingleOrDefault();
                return lopChuyenNganh;
            }
        }

        /// <summary>
        /// Danh sách các mã lớp chuyên ngành
        /// </summary>
        /// <param name="namHoc"></param>
        /// <param name="hocKy"></param>
        /// <param name="maCN"></param>
        /// <returns></returns>
        internal static List<string> GetListMaLopCN(string namHoc, int hocKy, string maCN)
        {
            using (var context = new QLHPEntities())
            {
                var listmaLopCN = from e in context.LopHocPhanChuyenNganhDbSet
                                  where e.HocKy.NamHoc == namHoc && e.HocKy.SoHieuHocKy == hocKy && e.LopChuyenNganh.MaChuyenNganh == maCN
                                  select e.MaLopChuyenNganh;
                return listmaLopCN.ToList();
            }
        }

        /// <summary>
        /// Lấy danh sách các năm tuyển sinh
        /// </summary>
        /// <param name="maNganh"></param>
        /// <returns></returns>
        internal static List<string> GetListNamTuyenSinh()
        {
            using (var context = new QLHPEntities())
            {
                var lstGroupNamTuyenSinh = from lopCN in context.LopChuyenNganhDbSet
                                           group lopCN by lopCN.NamTuyenSinh into NamTuyenSinhGroup
                                           orderby NamTuyenSinhGroup.Key descending
                                           select new { NamTuyenSinh = NamTuyenSinhGroup.Key };
                var lstNamTuyenSinh = new List<string>();
                foreach (var group in lstGroupNamTuyenSinh)
                    lstNamTuyenSinh.Add(group.NamTuyenSinh.ToString());

                return lstNamTuyenSinh;
            }
        }

        /// <summary>
        /// Lấy danh sách các lớp chuyên ngành bao gồm cả thông tin về ngành
        /// </summary>
        /// <param name="maNganh"></param>
        /// <param name="stNamTuyenSinh"></param>
        /// <returns></returns>
        internal static IList<LopChuyenNganh> GetList_LopChuyenNganh(string stNamTuyenSinh)
        {
            using (var context = new QLHPEntities())
            {
                try
                {
                    int namTuyenSinh = Convert.ToInt32(stNamTuyenSinh);
                    var query = from lopCN in context.LopChuyenNganhDbSet.Include("Nganh")
                                where lopCN.NamTuyenSinh == namTuyenSinh
                                select lopCN;
                    List<LopChuyenNganh> lstLopChuyenNganh = query.ToList();
                    return lstLopChuyenNganh;
                }
                catch
                {
                    return null;
                }
            }
        }

        /// <summary>
        /// Cập nhật thông tin lớp chuyên ngành
        /// </summary>
        /// <param name="oLopChuyenNganh"></param>
        internal static void Update_LopChuyenNganh(LopChuyenNganh lopChuyenNganh)
        {
            using (var context = new QLHPEntities())
            {
                try
                {
                    var oLopChuyenNganh = context.LopChuyenNganhDbSet.
                        Where(e => e.MaLopChuyenNganh == lopChuyenNganh.MaLopChuyenNganh).
                        FirstOrDefault();
                    if (oLopChuyenNganh == null)
                        throw new Exception("Lớp chuyên ngành không còn tồn tại trên hệ thống");

                    // Thực hiện cập nhật
                    oLopChuyenNganh.MaChuyenNganh = lopChuyenNganh.MaChuyenNganh;
                    oLopChuyenNganh.NamTuyenSinh = lopChuyenNganh.NamTuyenSinh;
                    context.SaveChanges();
                }
                catch (Exception exc)
                {
                    throw new Exception("Không thể cập nhật lớp chuyên ngành\n" + exc.Message, exc);
                }
            }
        }

        /// <summary>
        /// Tạo mới lớp chuyên ngành
        /// </summary>
        /// <param name="oLopChuyenNganh"></param>
        internal static void AddNew_LopChuyenNganh(LopChuyenNganh lopChuyenNganh)
        {
            using (var context = new QLHPEntities())
            {
                try
                {
                    // Kiểm tra xem đã có lớp chuyên ngành cùng (ngành, năm tuyển sinh hay không)
                    int count = context.LopChuyenNganhDbSet.
                        Where(e => e.MaChuyenNganh == lopChuyenNganh.MaChuyenNganh &&
                        e.NamTuyenSinh == lopChuyenNganh.NamTuyenSinh).
                        Count();
                    if (count > 0)
                        throw new Exception("Đã tồn tại lớp chuyên ngành này rồi!");

                    // Thực hiện tạo mới
                    context.LopChuyenNganhDbSet.Add(lopChuyenNganh);
                    context.SaveChanges();
                }
                catch (Exception exc)
                {
                    throw new Exception("Không thể tạo mới lớp chuyên ngành\n" + exc.Message, exc);
                }
            }
        }

        /// <summary>
        /// Xoá lớp chuyên ngành
        /// </summary>
        /// <param name="p"></param>
        internal static void Delete_LopChuyenNganh(string maLopChuyenNganh)
        {
            using (var context = new QLHPEntities())
            {
                try
                {
                    // Kiểm tra xem có thực sự có lớp chuyên ngành hay không
                    var oLopChuyenNganh = context.LopChuyenNganhDbSet.
                                Where(e => e.MaLopChuyenNganh == maLopChuyenNganh).
                                FirstOrDefault();
                    if (oLopChuyenNganh == null)
                        throw new Exception("Lớp chuyên ngành không còn tồn tại trên hệ thống");

                    // Kiểm tra xem có còn sinh viên trong lớp chuyên ngành hay không
                    int count = oLopChuyenNganh.SinhVienCollection.Count;
                    if (count > 0)
                        throw new Exception("Lớp chuyên ngành còn có chứa sinh viên");

                    // Thực hiện xóa
                    context.LopChuyenNganhDbSet.Remove(oLopChuyenNganh);
                    context.SaveChanges();
                }
                catch (Exception exc)
                {
                    throw new Exception("Không thể xoá lớp chuyên ngành\n" + exc.Message, exc);
                }
            }
        }
    }
}
